﻿using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web.Http;
using TccServicos.Models;
using TccServicos.Util;

namespace TccServicos.Controllers
{
    public class PessoaController : ApiController
    {
        #region Atributos
        private string sThread = "";
        #endregion

        #region WebApis do TCC Pessoa
        [HttpPost]
        public RetornoServico SavePessoa(Pessoa objeto)
        {
            sThread = Util.Util.NextHex(4);
            string nomeFuncao = string.Format("{0} [{1}]", "SavePessoa", sThread);

            try
            {
                if (!Validacao.ObjetoValido(objeto))
                {
                    Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, Validacao.objetoInvalido));
                }

                string jsonEntrada = JsonConvert.SerializeObject(objeto, new JsonSerializerSettings()
                {
                    NullValueHandling = NullValueHandling.Ignore
                });

                Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, jsonEntrada));

                using (adoteEntities contexto = new adoteEntities())
                {
                    Pessoa informacaosCad = new Pessoa();
                    if (!string.IsNullOrEmpty(objeto.email))
                    {
                        informacaosCad = (from t in contexto.CADASTRO_PESSOA.AsNoTracking()
                                          where t.EMAIL == objeto.email
                                          select new Pessoa()
                                          {
                                              idPessoa = t.ID_CADASTRO_PESSOA,
                                              senha = t.SENHA,
                                              token = t.TOKEN,
                                        }).FirstOrDefault();
                    }
                    int existeEmail = 0;
                    if (informacaosCad != null && informacaosCad.idPessoa > 0)
                        existeEmail = informacaosCad.idPessoa;

                    string senha = Util.Util.NextIntCadastro();

                    var objetoSalvar = new CADASTRO_PESSOA
                    {
                        ID_CADASTRO_PESSOA = objeto.idPessoa,
                        NOME = objeto.nome,
                        TELEFONE = objeto.telefone,
                        EMAIL = objeto.email,
                        TOKEN = objeto.token,
                    };
                    if (objeto.excluir)
                    {
                        contexto.CADASTRO_PESSOA.Attach(objetoSalvar);
                        contexto.Entry(objetoSalvar).State = System.Data.EntityState.Deleted;
                        contexto.SaveChanges();
                    }
                    else if (objeto.idPessoa > 0 || existeEmail > 0)
                    {
                        if (existeEmail > 0 && objeto.idPessoa == 0)
                            objetoSalvar.ID_CADASTRO_PESSOA = existeEmail;
                        if (existeEmail > 0)
                        {
                            objetoSalvar.SENHA = string.IsNullOrEmpty(informacaosCad.senha) ? senha : informacaosCad.senha;
                            objetoSalvar.TOKEN = informacaosCad.token;
                        }
                        contexto.CADASTRO_PESSOA.Attach(objetoSalvar);
                        contexto.Entry(objetoSalvar).State = System.Data.EntityState.Modified;
                        contexto.SaveChanges();
                    }
                    else
                    {
                        objetoSalvar.SENHA = senha;
                        contexto.CADASTRO_PESSOA.Add(objetoSalvar);
                        contexto.SaveChanges();
                    }

                    /*
                    if (!string.IsNullOrEmpty(objeto.email) && !objeto.excluir)
                        System.Threading.Tasks.Task.Run(() =>
                            TccServicos.Servicos.Servicos.EnviaEmail(objeto.email,
                            "Busca Pet - Cadastro", "Obrigado " + objeto.nome + " por se cadastrar no Busca Pet.",
                            "Sua senha de acesso é " + objetoSalvar.SENHA + ". Abra o aplicativo e informe esta senha no seu Perfil."));
                    */

                    if (!string.IsNullOrEmpty(objeto.email) && !objeto.excluir)
                    {
                        string endereco = Util.Util.BuscaConfig("EnderecoWebApi");

                        EmailPayload emailPayload = new EmailPayload()
                        {
                            para = objeto.email,
                            titulo = "Busca Pet - Cadastro",
                            mensagem1 = "Obrigado " + objeto.nome + " por se cadastrar no Busca Pet.",
                            mensagem2 = "Sua senha de acesso é " + objetoSalvar.SENHA + ". Abra o aplicativo e informe esta senha no seu Perfil.",
                        };
                        string json = JsonConvert.SerializeObject(emailPayload, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore });

                        WebClient webClient = new WebClient();
                        webClient.Encoding = new System.Text.UTF8Encoding();
                        webClient.Headers[HttpRequestHeader.ContentType] = "application/json; charset=utf-8";
                        webClient.UploadStringAsync(new Uri(endereco + "api/Email/EnviaEmail"), json);
                    }

                    Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, Validacao.salvoComSucesso));
                    return Util.Util.RetornoOk(objetoSalvar.ID_CADASTRO_PESSOA);
                }
            }
            catch (Exception ex)
            {
                Log.GravarLog(string.Format("{0} Erro: {1}", nomeFuncao, ex.ToString()));
                return Util.Util.RetornoErro(ex.ToString());
            }
        }

        [HttpGet]
        public List<Pessoa> GetPessoa([FromUri] int? idPessoa = null, [FromUri] string email = null)
        {
            sThread = Util.Util.NextHex(4);
            string nomeFuncao = string.Format("{0} [{1}]", "GetPessoa", sThread);

            try
            {
                Log.GravarLog(string.Format("{0}: id={1}", nomeFuncao, idPessoa.HasValue ? idPessoa.Value.ToString() : "0"));

                using (adoteEntities contexto = new adoteEntities())
                {
                    var consulta = (from t in contexto.CADASTRO_PESSOA.AsNoTracking()
                                    select new Pessoa
                                    {
                                        idPessoa = t.ID_CADASTRO_PESSOA,
                                        nome = t.NOME,
                                        telefone = t.TELEFONE,
                                        email = t.EMAIL,
                                        senha = t.SENHA,
                                        token = t.TOKEN,
                                    });
                    if (idPessoa.HasValue)
                        consulta = consulta.Where(x => x.idPessoa.Equals(idPessoa.Value));
                    if (!string.IsNullOrEmpty(email))
                        consulta = consulta.Where(x => x.email.Equals(email));
                    consulta = consulta.OrderBy(x => x.email);

                    var retorno = consulta.ToList();

                    Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, Validacao.consultaComSucesso));

                    return retorno;
                }
            }
            catch (Exception ex)
            {
                Log.GravarLog(string.Format("{0} Erro: {1}", nomeFuncao, ex.ToString()));
                return default(List<Pessoa>);
            }
        }
        #endregion

    }
}